package com.atguigu.jucdemo.cas;

import ch.qos.logback.core.util.TimeUtil;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/*
 * 100个线程，每个线程加100次，求最后的number值
 * 一共有两种输入值的方法：
 *      1、在set方法上加synchronized关键字，使其安全执行
 *      2、使用AtomicInteger 保证原子性的操作，（原子性指的就是，我可以保证数据的同时成功或者失败，中途不被人修改）
                     *                      读取、计算、写入成为不可分割的单一操作
                                            其他线程无法看到中间状态
                                            如果执行失败会重试直到成功
 */
public class CasDemo {
    private int number;
    private AtomicInteger atomicInteger = new AtomicInteger();

    public int getNumber() {
        return number;
    }

    public synchronized void setNumber() {
        ++number;
    }

    public AtomicInteger getAtomicInteger() {
        return atomicInteger;
    }

    public void setAtomicInteger() {
        atomicInteger.incrementAndGet();
    }

    public static void main(String[] args) throws InterruptedException {
        CasDemo casDemo = new CasDemo();
        CountDownLatch countDownLatch = new CountDownLatch(100);

        for (int i = 1; i <= 100; i++) {
            new Thread(()->{
                for (int j = 1; j <=100 ; j++) {
                    //casDemo.setNumber();
                    casDemo.setAtomicInteger();
                }
                countDownLatch.countDown();
            },String.valueOf(i)).start();

        }
        countDownLatch.await();
        //TimeUnit.SECONDS.sleep(1);
        //System.out.println(casDemo.getNumber());
        System.out.println(casDemo.getAtomicInteger().get());
    }
}
